package main

import (
	"fmt"
)

// 指针示例
func setVal(v []string) []string {
	v = []string{"a", "b"}
	return v
}

func setVal1(v *[]string) []string {
	*v = []string{"a1", "b1"}
	return *v
}

// 为什么使用指针作为参数传入，因为值传入的实参和形参指向不同地址，但是如果想要绑定形参和实参也就是参数的改变
// 会引起函数联动的变化必须使用指针绑定形参和实参，否则形参不会改变
func main() {
	a := 1
	b := &a
	var c **int = &b
	var d int = *b

	/*
		a是什么
		&a是什么
		*&a是什么
		b是什么
		&b是什么
		*b, c, *c,&c, *&c, **c, ***&*&*&*&c,d
	*/
	fmt.Println(a)
	fmt.Println(&a)
	fmt.Println(*&a)
	fmt.Println(b)
	fmt.Println(&b)
	fmt.Println(*b)
	fmt.Println(c)
	fmt.Println(*c)
	fmt.Println(&c)
	fmt.Println(*&c)
	fmt.Println(**c)
	fmt.Println(**&*&*&*&c)
	fmt.Println(d)
	//调用无指针
	var str []string              //未赋值内部指针为空
	fmt.Print("当前str的内存地址", &str) //因为没有内存地址，因此函数中的赋的值没有指向
	setVal(str)
	fmt.Println("无指针", str)
	//有指针，可以把函数内定义掉出来并改变值
	setVal1(&str)
	fmt.Println("有指针", str)
}
